package utils

import (
	"bytes"
	"encoding/json"
	"io"
	"log"
	"net/http"
	"strings"
	"time"
)

// SensitiveWordFilter 敏感词过滤器
type SensitiveWordFilter struct {
	localWords []string
}

// NewSensitiveWordFilter 创建敏感词过滤器
func NewSensitiveWordFilter() *SensitiveWordFilter {
	return &SensitiveWordFilter{
		localWords: []string{
			"反动", "色情", "暴力", "赌博", "毒品", "诈骗",
			"违禁", "非法", "违法", "犯罪", "恐怖", "分裂",
			"邪教", "迷信", "谣言", "诽谤", "辱骂", "威胁",
		},
	}
}

// CheckContent 检查内容是否包含敏感词
func (f *SensitiveWordFilter) CheckContent(content string) (bool, string) {
	// 优先使用本地检测（因为API可能不稳定）
	hasSensitive := f.checkByLocal(content)
	if hasSensitive {
		return true, "内容包含敏感词汇，请修改后重试"
	}

	// 可选：调用外部API进行二次验证
	// 由于客源API的具体实现未知，这里保留框架但不强制使用
	// if hasSensitive, msg := f.checkByAPI(content); hasSensitive {
	// 	return true, msg
	// }

	return false, ""
}

// checkByAPI 通过API检测敏感词
func (f *SensitiveWordFilter) checkByAPI(content string) (bool, string) {
	// 使用客源API进行检测
	apiURL := "https://api.apiopen.top/api/sentences"

	// 使用文本检测接口
	// 实际API可能不同，这里使用模拟的方式
	client := &http.Client{
		Timeout: 5 * time.Second,
	}

	// 由于客源API的敏感词检测接口可能不存在，我们使用本地库作为主要方案
	// 这里保留API调用的框架，可以根据实际API调整
	req, err := http.NewRequest("GET", apiURL, nil)
	if err != nil {
		log.Printf("创建API请求失败: %v", err)
		return false, ""
	}

	resp, err := client.Do(req)
	if err != nil {
		log.Printf("API调用失败，降级到本地检测: %v", err)
		return false, ""
	}
	defer resp.Body.Close()

	// 尝试解析响应
	var result map[string]interface{}
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return false, ""
	}

	if err := json.Unmarshal(body, &result); err != nil {
		return false, ""
	}

	// 根据实际API返回格式判断
	// 这里假设API返回格式为 {"code": 200, "contain": true/false, "message": "xxx"}
	if contain, ok := result["contain"].(bool); ok {
		if contain {
			msg := ""
			if message, ok := result["message"].(string); ok {
				msg = message
			} else {
				msg = "内容包含敏感词"
			}
			return true, msg
		}
	}

	return false, ""
}

// checkByLocal 通过本地词库检测敏感词
func (f *SensitiveWordFilter) checkByLocal(content string) bool {
	for _, word := range f.localWords {
		if bytes.Contains([]byte(content), []byte(word)) {
			return true
		}
	}
	return false
}

// FilterXSS 简单的XSS过滤
func FilterXSS(content string) string {
	// 移除HTML标签
	content = strings.ReplaceAll(content, "<script", "")
	content = strings.ReplaceAll(content, "</script>", "")
	content = strings.ReplaceAll(content, "<iframe", "")
	content = strings.ReplaceAll(content, "</iframe>", "")
	content = strings.ReplaceAll(content, "<javascript", "")
	content = strings.ReplaceAll(content, "</javascript>", "")
	return content
}
